package 链表;

public class No328奇偶链表 {

    /**
     * 给定一个单链表，把所有的奇数节点和偶数节点分别排在一起。
     * 请注意，这里的奇数节点和偶数节点指的是节点编号的奇偶性，而不是节点的值的奇偶性。
     * 请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1)，时间复杂度应为 O(nodes)，nodes 为节点总数。
     * 示例 1:
     * 输入: 1->2->3->4->5->NULL
     * 输出: 1->3->5->2->4->NULL
     * 示例 2:
     * 输入: 2->1->3->5->6->4->7->NULL
     * 输出: 2->3->6->7->1->5->4->NULL
     */

    /**
     * 需要空间复杂度为O(1),所以不能开始就新建立一个链表
     * 解题思路还是两条链表拼接  O(1)原地连接链表需要想一想
     */
    @SuppressWarnings("all")
    public static ListNode oddEvenList(ListNode head) {

        if(head==null)
            return null;

        ListNode odd=head;//奇数链表
        ListNode even=head.next;//偶数链表
        ListNode evenTou=even;//偶数链表头

        while (odd.next!=null&&even.next!=null){//even!=null保护偶数个,even.next!=null保护奇数个
            /**
             * 就地连接,不用创建出新的Node
             */
            //连接奇链表
            odd.next=even.next;

            //维护奇链表
            odd=odd.next;//偶数个结尾的话,这里odd就会为空

            //连接偶链表
            even.next=odd.next;

            //维护偶链表
            even=even.next;//奇数个链表的话,这里even就会为空
        }

        odd.next=evenTou;


        return head;
    }

    @SuppressWarnings("all")
    public static ListNode oddEvenListGood(ListNode head) {
        if (head == null)
            return null;
        ListNode odd = head;//奇数链表
        ListNode even = head.next;//偶数链表
        ListNode evenHead = even;//偶数链表头

        while (even != null && even.next != null) {

            //奇数下一个等于偶数下一个
            odd.next = even.next;

            //奇数链表递进
            odd = odd.next;

            //偶数链表递进
            even.next = odd.next;

            //偶数链表递进
            even = even.next;
        }

        odd.next = evenHead;

        return head;
    }

    public static void main(String[] args) {
        int[] arr=new int[]{1,2,3,4,5,6,7};
        ListNode listNode = ListNode.createListNode(arr);
        ListNode result = oddEvenList(listNode);
        ListNode.printListNode(result);
    }

}
